﻿using System;
using System.Collections.Generic;
using System.Data.Objects;
using System.Linq;
using System.Web;
using web_uchet.Models;
using Microsoft.Practices.EnterpriseLibrary.Validation.Validators;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel;
namespace web_uchet.ViewModels
{
    [System.Web.Mvc.Bind(Exclude = "ИД_Услуги,ИД_Компании")]
    public class ViewУслуга_Компании
    {
        public ViewУслуга_Компании()
        {
            this._Услуга_Компании = new Услуга_Компании();
            this.ИД_Компании = 0;
            this.ИД_Валюты = 0;
            this.Название = string.Empty;
        }
        public ViewУслуга_Компании(Услуга_Компании Услуга_Компании)
        {
            this._Услуга_Компании = Услуга_Компании;
        }
        private Услуга_Компании _Услуга_Компании;
        public Услуга_Компании Услуга_Компании
        {
            get { return this._Услуга_Компании; }
        }

        [ScaffoldColumn(false)]
        public int ИД_Услуги
        {
            get { return this._Услуга_Компании.ИД_Услуги; }
            set { this._Услуга_Компании.ИД_Услуги = value; }
        }
        //[Microsoft.Practices.EnterpriseLibrary.Validation.Validators.RangeValidator(0,RangeBoundaryType.Inclusive,float.MaxValue,RangeBoundaryType.Inclusive,
        //    MessageTemplate=web_uchet.StringResources.ValidationStringResources.Range0MaxValidationMessage)]
        [DisplayName("Цена_Услуги по-умолчанию:")]
        public float Цена_По_Умолчанию
        {
            get { return this._Услуга_Компании.Цена_По_Умолчанию; }
            set { this._Услуга_Компании.Цена_По_Умолчанию = value; }
        }
        [StringLengthValidator(30,MessageTemplate=web_uchet.StringResources.ValidationStringResources.StringLength30ValidationMessage)]
        [Mvc.Validation.Validators.NotNullOrEmptyValidator(MessageTemplate=web_uchet.StringResources.ValidationStringResources.RequiredValidationMessage)]
        [DisplayName("Название:")]
        public string Название
        {
            get { return this._Услуга_Компании.Название; }
            set { this._Услуга_Компании.Название = value; }
        }
        [ScaffoldColumn(false)]
        public int ИД_Компании
        {
            get { return (int)this._Услуга_Компании.КомпанияReference.EntityKey.EntityKeyValues.First(e => e.Key == "ИД_Компании").Value; }
            set { this._Услуга_Компании.КомпанияReference.EntityKey = new System.Data.EntityKey("ModelWebUchetCon.Компании", "ИД_Компании", value); }
        }
        [DisplayName("Валюта:")]
        public int ИД_Валюты
        {
            get { return (int)this._Услуга_Компании.ВалютаReference.EntityKey.EntityKeyValues.First(e => e.Key == "ИД_Валюты").Value; }
            set { this._Услуга_Компании.ВалютаReference.EntityKey = new System.Data.EntityKey("ModelWebUchetCon.Валюты", "ИД_Валюты", value); }
        }
        //[NotNullValidator(MessageTemplate = web_uchet.StringResources.ValidationStringResources.RequiredValidationMessage)]
        public Валюта Валюта
        {
            get { return this._Услуга_Компании.Валюта; }
            set { this._Услуга_Компании.Валюта = value; }
        }
    }

    public class ViewУслуга_КомпанииOperationProvider
    {
        private ModelWebUchetCon _Context;
        private web_uchet.Security.ProgramContext _SecurityContext;

        public ViewУслуга_КомпанииOperationProvider(web_uchet.Security.ProgramContext SecurityContext)
        {
            this._Context = new ModelWebUchetCon(ModelWebUchetCon.SingleToneConnection);
            this._SecurityContext = SecurityContext;
        }
        public ViewУслуга_КомпанииOperationProvider(ModelWebUchetCon Context, web_uchet.Security.ProgramContext SecurityContext)
        {
            this._Context = Context;
            this._SecurityContext = SecurityContext;
        }

        //v CompanyID - ID компании для которой делаем LIST
        public IEnumerable<ViewУслуга_Компании> List()
        {
            var УслугиКомпании = this._Context.Услуги_Компаний.Include("Валюта")
                .Where(e => e.Компания.ИД_Компании == this._SecurityContext.CompanyID)
                .OrderBy(e => e.Название).ToList();
            УслугиКомпании.Remove(УслугиКомпании.First(e => e.Название == "Нет"));
            return УслугиКомпании.Select(e => new ViewУслуга_Компании(e));
        }
        public IQueryable<Услуга_Компании> IQueryableУслуги()
        {
            return this._Context.Услуги_Компаний.Where(e => e.Компания.ИД_Компании == this._SecurityContext.CompanyID
                && e.Название != "Нет");
        }
        public ViewУслуга_Компании Details(int УслугаКомпанииID)
        {
            ViewУслуга_Компании NeededService =
                new ViewУслуга_Компании(this._Context.Услуги_Компаний.Include("Валюта").First(e => e.ИД_Услуги == УслугаКомпанииID));
            if (NeededService.ИД_Компании == this._SecurityContext.CompanyID)
                return NeededService;
            else throw new System.Security.SecurityException("Попытка получить данные чужой компании");
        }
        //Delete Услуга
        public void Delete(int УслугаКомпанииID)
        {
            Услуга_Компании ObjectToDelete = this.Details(УслугаКомпанииID).Услуга_Компании;
            Услуга_Компании NoУслугаКомпании = this._Context.Услуги_Компаний.First(e => e.Компания.ИД_Компании == this._SecurityContext.CompanyID &&
                e.Название == "Нет");
            foreach (Деталь_Заказа OrderDetail in this._Context.Детали_Заказов.Where(e => e.Услуга.ИД_Услуги == ObjectToDelete.ИД_Услуги))
                OrderDetail.Услуга = NoУслугаКомпании;

            this._Context.DeleteObject(ObjectToDelete);
            this.SaveChanges();
        }

        public void Create(ViewУслуга_Компании NewViewУслуга_Компании)
        {
            NewViewУслуга_Компании.ИД_Компании = this._SecurityContext.CompanyID;
            this._Context.AddToУслуги_Компаний(NewViewУслуга_Компании.Услуга_Компании);
            this.SaveChanges();
        }
        public void SaveChanges()
        {
            this._Context.SaveChanges(true);
        }


        public System.Web.Mvc.SelectList GetCurrencies(int? SelectedCurrency)
        {
            return
                web_uchet.ViewModels.SelectLists.SelectListService.GetCurrencies(SelectedCurrency, this._Context);
        }

    }
}